package com.techsen.tsweb.sys.service.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.techsen.tsweb.core.service.impl.BaseService;
import com.techsen.tsweb.core.util.ValidUtil;
import com.techsen.tsweb.sys.dao.CompanyDao;
import com.techsen.tsweb.sys.dao.DeptDao;
import com.techsen.tsweb.sys.dao.OrgDao;
import com.techsen.tsweb.sys.dao.PersonDao;
import com.techsen.tsweb.sys.dao.PostDao;
import com.techsen.tsweb.sys.domain.Company;
import com.techsen.tsweb.sys.domain.Dept;
import com.techsen.tsweb.sys.domain.Org;
import com.techsen.tsweb.sys.domain.Person;
import com.techsen.tsweb.sys.domain.Post;
import com.techsen.tsweb.sys.service.OrgService;

@Service
public class OrgServiceImpl extends BaseService<Org, OrgDao> implements OrgService {

    @Resource
    private CompanyDao companyDao;
    
    @Resource
    private DeptDao deptDao;
    
    @Resource
    private PostDao postDao;
    
    @Resource
    private PersonDao personDao;
    
    @Resource @Override
    public void setDao(OrgDao dao) {
        this.dao = dao;
    }
    
    /**
     * 根据组织类型查询组织集合
     */
    @Override
    public List<Org> findByOrgTypes(List<String> orgTypes) {
        return this.dao.findByOrgTypes(orgTypes);
    }
    
    /**
     * 根据组织ID查询所有子组织集合
     */
    @Override
    public List<Org> getAllChildrenOrg(String id) {
        return this.dao.getAllChildrenOrg(id);
    }
    
    /**
     * 根据组织ID查询所有子组织ID集合
     */
    @Override
    public List<String> getAllChildrenOrgId(String id) {
        return this.dao.getAllChildrenOrgId(id);
    }
    
    /**
     * 添加组织<br/>
     * 添加组织时，根据组织的类型，添加一个相应的组织对象
     */
    @Override
    public Org add(Org org) {
        super.add(org);
        if (Company.class.getSimpleName().toLowerCase().equals(org.getOrgType())) {
            this.companyDao.add(new Company(org));
        } else if (Dept.class.getSimpleName().toLowerCase().equals(org.getOrgType())) {
            this.deptDao.add(new Dept(org));
        } else if (Post.class.getSimpleName().toLowerCase().equals(org.getOrgType())) {
            this.postDao.add(new Post(org));
        } else if (Person.class.getSimpleName().toLowerCase().equals(org.getOrgType())) {
            this.personDao.add(new Person(org));
        }
        return org;
    }
    
    /**
     * 删除组织<br/>
     * 删除组织时，根据组织的类型，删除组织对象所对应的对象
     */
    @Override
    public void delete(String id) {
        /**
         * 获取所有子组织对象
         */
        List<Org> orgs = this.dao.getAllChildrenOrg(id);
        if (ValidUtil.isValid(orgs)) {
            /**
             * 将子组织按类型分类
             */
            Map<String, List<String>> map = new HashMap<String, List<String>>();
            /**
             * 收集所有子组织ID
             */
            List<String> ids = new ArrayList<String>();
            for (Org org : orgs) {
                if (!map.containsKey(org.getOrgType())) {
                    map.put(org.getOrgType(), new ArrayList<String>());
                }
                map.get(org.getOrgType()).add(org.getId());
                ids.add(org.getId());
            }
            /**
             * 根据子组织的类型和子组织ID集合，删除子组织对象所对应的对象
             */
            for (String orgType : map.keySet()) {
                List<String> orgIds = map.get(orgType);
                if (Company.class.getSimpleName().toLowerCase().equals(orgType)) {
                    this.companyDao.deleteByOrgIds(orgIds);
                } else if (Dept.class.getSimpleName().toLowerCase().equals(orgType)) {
                    this.deptDao.deleteByOrgIds(orgIds);
                } else if (Post.class.getSimpleName().toLowerCase().equals(orgType)) {
                    this.postDao.deleteByOrgIds(orgIds);
                } else if (Person.class.getSimpleName().toLowerCase().equals(orgType)) {
                    this.personDao.deleteByOrgIds(orgIds);
                }
            }
            /**
             * 删除所有子组织对象
             */
            super.deleteByIds(ids);
        }
    }
    
}
